home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Magazine / Online / OpenURL / Developer / Source / prefs_mailereditwin.c < prev    next >
C/C++ Source or Header  |  1999-09-26  |  9KB  |  294 lines

  1. /*
  2. ** OpenURL - MUI preferences for openurl.library
  3. ** Written by Troels Walsted Hansen <troels@thule.no>
  4. ** Placed in the public domain.
  5. **
  6. ** This module contains the code to the MailerEditWin Window.mui subclass.
  7. */
  8.  
  9. #include "prefs_common.h"
  10. #include "prefs_main.h"
  11. #include "prefs_app.h"
  12. #include "prefs_mailereditwin.h"
  13.  
  14. /**************************************************************************/
  15.  
  16. static ULONG mNew           (struct IClass *cl, Object *obj, struct opSet *msg);
  17. static ULONG mGet           (struct IClass *cl, Object *obj, struct opGet *msg);
  18. static ULONG mWindow_Setup  (struct IClass *cl, Object *obj, struct MUIP_Window_Setup *msg);
  19. static ULONG mOk            (struct IClass *cl, Object *obj, struct MUIP_MailerEditWin_Ok *msg);
  20.  
  21. static SAVEDS ASM VOID ObjStrFunc(REG(a0) struct Hook *hook, 
  22.                                   REG(a2) Object *obj, 
  23.                                   REG(a1) Object *string);
  24.  
  25. /**************************************************************************/
  26.  
  27. static const char *Mailer_PlaceHolders[] =
  28. {
  29.     "%a|address",
  30.     "%s|subject",
  31.     "%b|bodytext",
  32.     "%f|bodytext file",
  33.     "%u|URL",
  34.     NULL,
  35. };
  36.  
  37. /**************************************************************************/
  38.  
  39. static ULONG mNew(struct IClass *cl, Object *obj, struct opSet *msg)
  40. {
  41.     Object *mailerl, *infog, *names, *pathp, *ports, *portp, 
  42.            *cmdg, *shows, *tofronts, *writemailp, *okb, *cancelb;
  43.  
  44.     struct URL_MailerNode *mn = (struct URL_MailerNode *)GetTagData(MUIA_MailerEditWin_Mailer, NULL, msg->ops_AttrList);
  45.     mailerl = (Object *)GetTagData(MUIA_MailerEditWin_ListObj, NULL, msg->ops_AttrList);
  46.  
  47.     if(!mn || !mailerl) return(0);
  48.  
  49.     obj = (Object *)DoSuperNew(cl, obj,
  50.         MUIA_Window_ID,          MAKE_ID('E', 'D', 'M', 'L'),
  51.         MUIA_Window_Title,       APPNAME " · Edit Mailer",
  52.         WindowContents, VGroup,
  53.             Child, infog = ColGroup(2),
  54.                 GroupFrameT("Mailer information"),
  55.  
  56.                 Child, KeyLabel2("Name", 'n'),
  57.                 Child, names = StringObject, 
  58.                     StringFrame,
  59.                     MUIA_CycleChain,         TRUE,
  60.                     MUIA_ControlChar,        'n',
  61.                     MUIA_String_MaxLen,      UMN_NAME_LEN,
  62.                     MUIA_String_Contents,    mn->umn_Name,
  63.                     MUIA_String_AdvanceOnCR, TRUE,
  64.                 End,
  65.  
  66.                 Child, KeyLabel2("Path", 'p'),
  67.                 Child, pathp = PopplaceholderObject, 
  68.                     MUIA_Popph_Array,        Mailer_PlaceHolders,
  69.                     MUIA_Popph_StringKey,    'p',
  70.                     MUIA_Popph_StringMaxLen, UMN_PATH_LEN,
  71.                     MUIA_Popph_Contents,     mn->umn_Path,
  72.                     MUIA_Popph_PopAsl,       TRUE,
  73.                     MUIA_Popasl_Type,        ASL_FileRequest,
  74.                 End,
  75.  
  76.                 Child, KeyLabel2("ARexx port", 'a'),
  77.                 Child, portp = PopportObject, 
  78.                     MUIA_Popstring_String, ports = StringObject, 
  79.                         StringFrame,
  80.                         MUIA_CycleChain,         TRUE,
  81.                         MUIA_ControlChar,        'a',
  82.                         MUIA_String_MaxLen,      UMN_PORT_LEN,
  83.                         MUIA_String_Contents,    mn->umn_Port,
  84.                         MUIA_String_AdvanceOnCR, TRUE,
  85.                     End,
  86.                     MUIA_Popstring_Button,  myPopButton(MUII_PopUp),
  87.                     MUIA_Popport_ARexxOnly, TRUE,
  88.                 End,
  89.             End,
  90.  
  91.             Child, cmdg = ColGroup(2),
  92.                 GroupFrameT("ARexx commands"),
  93.  
  94.                 Child, KeyLabel2("Show/Uniconify", 's'),
  95.                 Child, shows = StringObject, 
  96.                     StringFrame,
  97.                     MUIA_CycleChain,         TRUE,
  98.                     MUIA_ControlChar,        's',
  99.                     MUIA_String_MaxLen,      UMN_SHOWCMD_LEN,
  100.                     MUIA_String_Contents,    mn->umn_ShowCmd,
  101.                     MUIA_String_AdvanceOnCR, TRUE,
  102.                 End,
  103.  
  104.                 Child, KeyLabel2("Screen to front", 'f'),
  105.                 Child, tofronts = StringObject, 
  106.                     StringFrame,
  107.                     MUIA_CycleChain,         TRUE,
  108.                     MUIA_ControlChar,        'f',
  109.                     MUIA_String_MaxLen,      UMN_TOFRONTCMD_LEN,
  110.                     MUIA_String_Contents,    mn->umn_ToFrontCmd,
  111.                     MUIA_String_AdvanceOnCR, TRUE,
  112.                 End,
  113.  
  114.                 Child, KeyLabel2("Write Mail", 'w'),
  115.                 Child, writemailp = PopplaceholderObject,
  116.                     MUIA_Popph_Array,        Mailer_PlaceHolders,
  117.                     MUIA_Popph_StringKey,    'w',
  118.                     MUIA_Popph_StringMaxLen, UMN_WRITEMAILCMD_LEN,
  119.                     MUIA_Popph_Contents,     mn->umn_WriteMailCmd,
  120.                 End,
  121.             End,
  122.  
  123.             Child, ColGroup(3),
  124.                 Child, okb   = SimpleButton("_Ok"),
  125.                 Child, RectangleObject, End,
  126.                 Child, cancelb = SimpleButton("_Cancel"),
  127.             End,
  128.         End,
  129.         TAG_MORE, msg->ops_AttrList);
  130.  
  131.     if(obj)
  132.     {
  133.         struct MailerEditWin_Data *data = INST_DATA(cl, obj);
  134.         memset(data, '\0', sizeof(struct MailerEditWin_Data));
  135.  
  136.         /* init instance data */
  137.  
  138.         data->Mailer          = mn;
  139.         data->MailerLstObj    = mailerl;
  140.  
  141.         data->InfoGrpObj      = infog;
  142.         data->NameStrObj      = names;
  143.         data->PathPopObj      = pathp;
  144.         data->PortStrObj      = ports;
  145.  
  146.         data->CmdGrpObj       = cmdg;
  147.         data->ShowStrObj      = shows;
  148.         data->ToFrontStrObj   = tofronts;
  149.         data->WriteMailPopObj = writemailp;
  150.  
  151.         data->OkButObj        = okb;
  152.         data->CancelButObj    = cancelb;
  153.  
  154.         /* buttons */
  155.  
  156.         DoMethod(obj, MUIM_MultiSet, MUIA_CycleChain, TRUE, okb, cancelb, NULL);
  157.  
  158.         /* add hook */
  159.  
  160.         data->ObjStrHook.h_Entry = (HOOKFUNC)ObjStrFunc;
  161.         data->ObjStrHook.h_Data = (APTR)xget(portp, MUIA_Popobject_ObjStrHook);
  162.         set(portp, MUIA_Popobject_ObjStrHook, &data->ObjStrHook);
  163.     }
  164.  
  165.     return((ULONG)obj);
  166. }
  167.  
  168. /**************************************************************************/
  169.  
  170. static ULONG mGet(struct IClass *cl, Object *obj, struct opGet *msg)
  171. {
  172.     struct MailerEditWin_Data *data = INST_DATA(cl,obj);
  173.  
  174.     switch(msg->opg_AttrID)
  175.     {
  176.         case MUIA_MailerEditWin_Mailer:
  177.             *(msg->opg_Storage) = (ULONG)data->Mailer;
  178.             return(TRUE);
  179.     }
  180.  
  181.     return(DoSuperMethodA(cl, obj, (Msg)msg));
  182. }
  183.  
  184. /**************************************************************************/
  185.  
  186. static ULONG mWindow_Setup(struct IClass *cl, Object *obj, struct MUIP_Window_Setup *msg)
  187. {
  188.     struct MailerEditWin_Data *data = INST_DATA(cl,obj);
  189.  
  190.     if (!DoSuperMethodA(cl,obj,(Msg)msg))
  191.         return(FALSE);
  192.  
  193.     if(!data->NotifiesAdded)
  194.     {
  195.         /* buttons */
  196.         DoMethod(data->OkButObj,     MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, MUIM_MailerEditWin_Ok);
  197.         DoMethod(data->CancelButObj, MUIM_Notify, MUIA_Pressed, FALSE, obj, 3, MUIM_Set, MUIA_Window_CloseRequest, TRUE);
  198.  
  199.         /* window notifies */
  200.         DoMethod(obj, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, _app(obj), 6, MUIM_Application_PushMethod, _app(obj), 3, MUIM_App_CloseWin, MUIA_MailerEditWin_Mailer, data->Mailer);
  201.  
  202.         data->NotifiesAdded = TRUE;
  203.     }
  204.  
  205.     return(TRUE);
  206. }
  207.  
  208. /**************************************************************************/
  209.  
  210. static ULONG mOk(struct IClass *cl, Object *obj, struct MUIP_MailerEditWin_Ok *msg)
  211. {
  212.     struct MailerEditWin_Data *data = INST_DATA(cl,obj);
  213.     struct URL_MailerNode *mn = data->Mailer;
  214.     LONG visible, first, i;
  215.  
  216.     /* update the structure */
  217.  
  218.     strcpy(mn->umn_Name, (char *)xget(data->NameStrObj, MUIA_String_Contents));
  219.     strcpy(mn->umn_Path, (char *)xget(data->PathPopObj, MUIA_Popph_Contents));
  220.     strcpy(mn->umn_Port, (char *)xget(data->PortStrObj, MUIA_String_Contents));
  221.  
  222.     strcpy(mn->umn_ShowCmd,      (char *)xget(data->ShowStrObj,      MUIA_String_Contents));
  223.     strcpy(mn->umn_ToFrontCmd,   (char *)xget(data->ToFrontStrObj,   MUIA_String_Contents));
  224.     strcpy(mn->umn_WriteMailCmd, (char *)xget(data->WriteMailPopObj, MUIA_Popph_Contents));
  225.  
  226.     /* update the listview */
  227.  
  228.     get(data->MailerLstObj, MUIA_List_Visible, &visible);
  229.     if(visible != -1)
  230.     {
  231.         get(data->MailerLstObj, MUIA_List_First, &first);
  232.  
  233.         for(i = first; i < (first + visible); i++)
  234.         {
  235.             DoMethod(data->MailerLstObj, MUIM_List_GetEntry, i, &mn);
  236.             if(!mn) break;
  237.  
  238.             if(mn == data->Mailer)
  239.             {
  240.                 DoMethod(data->MailerLstObj, MUIM_List_Redraw, i);
  241.                 break;
  242.             }
  243.         }
  244.     }
  245.  
  246.     /* close edit site window */
  247.  
  248.     set(obj, MUIA_Window_CloseRequest, TRUE);
  249.  
  250.     return(TRUE);
  251. }
  252.  
  253. /**************************************************************************/
  254.  
  255. SAVEDS ASM ULONG MailerEditWin_Dispatcher(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
  256. {
  257.     switch(msg->MethodID)
  258.     {
  259.         case OM_NEW               : return(mNew         (cl,obj,(APTR)msg));
  260.         case OM_GET               : return(mGet         (cl,obj,(APTR)msg));
  261.         case MUIM_Window_Setup    : return(mWindow_Setup(cl,obj,(APTR)msg));
  262.         case MUIM_MailerEditWin_Ok: return(mOk          (cl,obj,(APTR)msg));
  263.     }
  264.  
  265.     return(DoSuperMethodA(cl,obj,msg));
  266. }
  267.  
  268. /**************************************************************************/
  269.  
  270. static SAVEDS ASM VOID ObjStrFunc(REG(a0) struct Hook *hook, 
  271.                                   REG(a2) Object *obj, 
  272.                                   REG(a1) Object *string)
  273. {
  274.     STRPTR port, dot, digit;
  275.     char buf[UMN_PORT_LEN];
  276.  
  277.     if(hook->h_Data) CallHookPkt(hook->h_Data, obj, string);
  278.  
  279.     get(string, MUIA_String_Contents, &port);
  280.     dot = strrchr(port, '.');
  281.  
  282.     if(dot)
  283.     {
  284.         dot++;
  285.  
  286.         for(digit = dot; *digit; digit++)
  287.             if(!isdigit(*digit))
  288.                 return;
  289.  
  290.         stccpy(buf, port, dot - port);
  291.         set(string, MUIA_String_Contents, buf);
  292.     }
  293. }
  294.